import { PrismaClient } from '@prisma/client';
import { logger } from '../utils/logger';
import { getRedisClient } from './redis';
import configureCache from '@/prisma-redis-cache/src';

// 创建基础 Prisma 客户端实例
const basePrisma = new PrismaClient({
  log: [
    {
      emit: 'event',
      level: 'error',
    },
    {
      emit: 'event',
      level: 'warn',
    },
  ],
});

// 错误日志
basePrisma.$on('error', (e: any) => {
  logger.error('Prisma Error: ' + e.message);
});

// 警告日志
basePrisma.$on('warn', (e: any) => {
  logger.warn('Prisma Warning: ' + e.message);
});

// 创建带缓存的 Prisma 客户端
let cachedPrisma: any = null;

/**
 * 获取带缓存的 Prisma 客户端
 */
export async function getCachedPrisma() {
  if (!cachedPrisma) {
    try {
      const redisClient = await getRedisClient();
      const cacheConfig = {
        redisClient,
      };
      let prisma = basePrisma.$extends(configureCache(cacheConfig));
      cachedPrisma = prisma;
      logger.info('Prisma Redis 缓存扩展已配置');
    } catch (error) {
      logger.error('初始化缓存扩展失败:', error);
      logger.info('使用无缓存的 Prisma 客户端');
      cachedPrisma = basePrisma;
    }
  }
  return cachedPrisma;
}

/**
 * 获取基础 Prisma 客户端实例
 */
export async function getPrismaClient(): Promise<PrismaClient> {
  // 尝试连接 Redis（可选）
  try {
    await getRedisClient();
    logger.info('Redis 连接成功，可用于缓存');
  } catch (error) {
    logger.info('Redis 连接失败，使用无缓存模式');
  }
  
  return basePrisma;
}

// 连接数据库
export async function connectDatabase(): Promise<void> {
  try {
    await basePrisma.$connect();
    logger.info('数据库连接成功');
  } catch (error) {
    logger.error('数据库连接失败:', error);
    throw error;
  }
}

// 断开数据库连接
export async function disconnectDatabase(): Promise<void> {
  try {
    await basePrisma.$disconnect();
    logger.info('数据库连接已断开');
  } catch (error) {
    logger.error('断开数据库连接失败:', error);
    throw error;
  }
}

// 导出基础 Prisma 客户端
export { basePrisma as prisma }; 